package services.web;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import services.web.blog.WebBlog;
import services.web.blog.WebBlogIF;
import services.web.blog._static.WebBlogServiceProxy;

import services.web.suscription.WebSuscription;
import services.web.suscription.WebSuscriptionIF;
import services.web.suscription._static.SuscriptionServiceStaticProxyAdapter;

/**
 * La clase sigue el patron Factory. Se utiliza para crear instancias de
 * clientes de blog y suscripciones que contengan internamente proxys estaticos,
 * dinamicos o hibridos.
 * 
 * @author Gonzalo Maso Talou
 */

public class WebClientFactory {

	/**
	 * Crea y retorna una instancia de {@link WebBlog} y le setea el proxy a una
	 * instancia de {@link WebBlogServiceProxy}.<BR/>
	 * 
	 * @return Instancia de {@link WebBlogIF}.
	 */

	public static WebBlogIF createStaticWebBlogClient() {
		WebBlogIF client = WebBlog.getInstance();
		client.setBlogServiceProxy(new WebBlogServiceProxy());
		return client;
	}

	/**
	 * Crea y retorna mediante el framework Spring un {@link WebBlogIF} cuyo
	 * proxy es creado dinamicamente por el mismo framework utilizando el
	 * archivo de configuracion
	 * "src/services/web/blog/_dynamic/webBlogService.xml".<BR/>
	 * 
	 * @return Instancia de {@link WebBlogIF}
	 */

	public static WebBlogIF createDynamicWebBlogClient() {

		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/web/blog/_dynamic/webBlogService.xml");
		WebBlogIF client = (WebBlogIF) ctx.getBean("blogClient");
		return client;
	}

	/**
	 * Crea y retorna mediante el framework Spring un {@link WebBlogIF} cuyo
	 * proxy es seteado a una instancia de {@link WebBlogServiceProxy} por el
	 * mismo framework (solucion hibrida) utilizando el archivo de configuracion
	 * "src/services/web/blog/_hybrid/webBlogService.xml".<BR/>
	 * 
	 * @return Instancia de {@link WebBlogIF}
	 */

	public static WebBlogIF createHybridWebBlogClient() {

		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/web/blog/_hybrid/webBlogService.xml");
		WebBlogIF client = (WebBlogIF) ctx.getBean("blogClient");
		return client;
	}

	/**
	 * Crea y retorna una instancia de {@link WebBlog} y le setea el proxy a una
	 * instancia de {@link WebSuscriptionServiceProxy}.<BR/>
	 * 
	 * @return Instancia de {@link WebSuscriptionIF}.
	 */
	public static WebSuscriptionIF createStaticWebSuscriptionClient() {
		WebSuscriptionIF client = WebSuscription.getInstance();
		client
				.setSuscriptionServiceProxy(new SuscriptionServiceStaticProxyAdapter());
		return client;
	}

	/**
	 * Crea y retorna mediante el framework Spring un {@link WebSuscriptionIF}
	 * cuyo proxy es creado dinamicamente por el mismo framework utilizando el
	 * archivo de configuracion
	 * "src/services/web/suscription/_dynamic/webSuscriptionService.xml".<BR/>
	 * 
	 * @return Instancia de {@link WebSuscriptionIF}
	 */
	public static WebSuscriptionIF createDynamicWebSuscriptionClient() {

		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/web/suscription/_dynamic/webSuscriptionService.xml");
		WebSuscriptionIF client = (WebSuscriptionIF) ctx
				.getBean("suscriptionClient");
		return client;
	}

	/**
	 * Crea y retorna mediante el framework Spring un {@link WebSuscriptionIF}
	 * cuyo proxy es seteado a una instancia de
	 * {@link WebSuscriptionServiceProxy} por el mismo framework (solucion
	 * hibrida) utilizando el archivo de configuracion
	 * "src/services/web/suscription/_hybrid/webSuscriptionService.xml".<BR/>
	 * 
	 * @return Instancia de {@link WebSuscriptionIF}
	 */
	public static WebSuscriptionIF createHybridWebSuscriptionClient() {

		FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
				"src/services/web/suscription/_hybrid/webSuscriptionService.xml");
		WebSuscriptionIF client = (WebSuscriptionIF) ctx
				.getBean("suscriptionClient");
		return client;
	}
}
